]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
st: Use g_signal_handler_disconnect() to disconnect from StTheme
authorCarlos Garnacho <carlosg@gnome.org>
Tue, 30 Apr 2019 12:42:59 +0000 (14:42 +0200)
committerCarlos Garnacho <carlosg@gnome.org>
Tue, 30 Apr 2019 13:02:29 +0000 (15:02 +0200)
With a high enough amount of actors, there may be enough theme nodes and
signal connections on StTheme::custom-stylesheets-changed that
g_signal_handlers_disconnect_by*() on dispose becomes expensive, this may
become a surprisingly hot spot in StWidget::style-changed.

Keep the handler ID around and use g_signal_handler_disconnect() to avoid
linear lookups for the matching func/data.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/524

src/st/st-theme-node-private.h
src/st/st-theme-node.c

index 2e6b232f6fc5355220000da3127ae969cca6c2b6..47be65dba83aa3d435895c0aaf682e8ac96e191f 100644 (file)
@@ -107,6 +107,8 @@ struct _StThemeNode {
   int box_shadow_min_width;
   int box_shadow_min_height;
 
+  guint stylesheets_changed_id;
+
   CoglPipeline *border_slices_texture;
   CoglPipeline *border_slices_pipeline;
   CoglPipeline *background_texture;
index 8a6ebf03f81e9401d90242a1c8c87df99b54b657..8e910f831173791e3ea3c49b5b947696cd88318b 100644 (file)
@@ -111,9 +111,11 @@ st_theme_node_dispose (GObject *gobject)
       node->icon_colors = NULL;
     }
 
-  if (node->theme)
-    g_signal_handlers_disconnect_by_func (node->theme,
-                                          on_custom_stylesheets_changed, node);
+  if (node->theme && node->stylesheets_changed_id)
+    {
+      g_signal_handler_disconnect (node->theme, node->stylesheets_changed_id);
+      node->stylesheets_changed_id = 0;
+    }
 
   st_theme_node_paint_state_free (&node->cached_state);
 
@@ -230,8 +232,9 @@ st_theme_node_new (StThemeContext    *context,
   if (theme != NULL)
     {
       node->theme = g_object_ref (theme);
-      g_signal_connect (node->theme, "custom-stylesheets-changed",
-                        G_CALLBACK (on_custom_stylesheets_changed), node);
+      node->stylesheets_changed_id =
+        g_signal_connect (node->theme, "custom-stylesheets-changed",
+                          G_CALLBACK (on_custom_stylesheets_changed), node);
     }
 
   node->element_type = element_type;